在线地图显示 (在线矢量地图)Sample (在线瓦片地图)Sample (天地图)Sample (百度地图)Sample (高德地图)Sample (Google地图)Sample (OSM地图)Sample

最后更新时间:2019年6月17日

在线地图显示方法

MapGIS移动端支持的在线地图数据类型包括:MapGIS的在线矢量、瓦片地图服务,基于OGC标准的地图服务(WMS、WMTS),以及第三方在线地图服务(天地图、Google地图、OSM地图、百度地图、高德地图、Bing地图等)。

在线地图数据来源众多,但显示方法原理相同,方法类似,在线地图的加载方法可以归纳为以下的两种,所有在线地图都可以通过这两种方式加载显示。

方法 接口 地图类型 使用场景
服务图层方式 setMapAsync 所有在线地图 不需配置地图文档
地图文档方式 loadFromFileAsync / loadFromDocumentAsync 所有在线地图 需要配置地图文档

一、服务图层方式

通过地图服务URL地址构造ServerLayer服务图层,从而构建map,然后调用setMap / setMapAsync方法加载。此方法经常采用于图层数量少的情况下,简单便捷,不需配置地图文档。接下来以MapGIS IGServer在线矢量地图服务为例展示实现过程。

//定义MapView对象与Map对象
private MapView mMapView;
private Map mMap;
//服务图层
private ServerLayer mServerLayer;

//获取移动端设备sd卡的根目录
public final static String rootPath = Environment.getExternalStorageDirectory().getPath();
public final static String systemPath = Environment.getExternalStorageDirectory().getPath() + "/MapGIS Mobile 2D Sample/";

//环境初始化,必须在使用SDK各组件之前调用,会自动建立根目录结构
com.zondy.mapgis.android.environment.Environment.initialize(systemPath, this);
//授权请求
com.zondy.mapgis.android.environment.Environment.requestAuthorization(this, new AuthorizeCallback() {
    @Override
    //授权完成后回调
    public void onComplete() {
        System.out.println("授权完成");
        //获取MapView对象
        mMapView = (MapView) findViewById(R.id.map_information);
        if (mMap == null) {
            mMap = new Map();
        }
        //构建服务地图对象
        MapServer mapServer = ServerLayer.createMapServer(MapServer.MAPSERVER_TYPE_IGSERVER_VECTOR);
        //设置在线url地址
        mapServer.setURL("http://develop.smaryun.com:6163/igs/rest/mrms/docs/WorldJWVector");
        //服务图层
        mServerLayer = new ServerLayer();
        //设置地图服务
        mServerLayer.setMapServer(mapServer);
        //将服务图层添加到地图对象中
        mMap.append(mServerLayer);
        //将地图对象显示在地图容器中
        mMapView.setMapAsync(mMap, new MapViewFinishCallback() {
            @Override
            public void onDidFinish(boolean arg0) {
                if (arg0) {
                    //在线矢量地图加载成功
                } else {
                    //在线矢量地图加载失败
                }
            }
        });
    }
});

所有在线地图加载使用的方法都一样,区别只是在构建MapServer地图服务对象时选择的服务类型的不同。MapGIS Mobile提供诸多类型的地图服务,例如MapGIS地图服务、OGC服务、天地图、Google地图服务、百度地图、高德地图等等,其地图服务类型对应的接口由com.zondy.mapgis.core.map.MapServer类提供,关键的地图服务类型如下表所示:

数据来源 数据类型 地图服务类型
在线 IGServer矢量地图服务 MAPSERVER_TYPE_IGSERVER_VECTOR
IGServer瓦片地图服务 MAPSERVER_TYPE_IGSERVER_TILE
WMS服务 MAPSERVER_TYPE_OGC_WMS
WMTS服务 MAPSERVER_TYPE_OGC_WMTS
天地图服务 MAPSERVER_TYPE_TIANDITU
谷歌地图服务 MAPSERVER_TYPE_GOOGLE_MAP
百度地图服务 MAPSERVER_TYPE_BAIDU_MAP
OSM地图服务 MAPSERVER_TYPE_OPENSTREET_STANDARD
Bing地图服务 MAPSERVER_TYPE_BING_MAP
离线 瓦片地图 MAPSERVER_TYPE_TDF

为方便用户使用公共地图服务,除了MapGIS IGServer地图服务、天地图系列的服务、OGC标准的WMS / WMTS服务,其他所有地图服务在接口内部已经设置好服务地址,不需用户调用setUrl方法自己设置。

重点说明:根据天地图的要求,使用天地图提供的地图服务,需要申请key,对此MapGIS Mobile对接了此要求,调用方法稍有不同,区别在于构建MapServer时还需设置认证信息,如下所示:

//获取服务地图对象,其中天地图的默认地图服务类型为MapServer.MAPSERVER_TYPE_TIANDITU
MapServer mapServer = ServerLayer.createMapServer(MapServer.MAPSERVER_TYPE_TIANDITU);
mapServer.setName("Tianditu_vec");
//设置认证信息
mapServer.setAuthentication("tk", "用户申请的key");
//设置在线url地址
mapServer.setURL("http://t0.tianditu.gov.cn/vec_c/wmts");

//服务图层
ServerLayer mServerLayer = new ServerLayer();
mServerLayer.setMapServer(mapServer);

说明:setAuthentication方法中的第二个参数即为key值,需要用户根据自己的应用申请,申请地址为天地图官网

二、地图文档方式

1、loadFromFileAsync方法

//异步方法加载地图:传入mapx地图文档在移动设备存储中的完整路径
mapView.loadFromFileAsync(MainActivity.rootPath+"/MapGIS Mobile 2D Sample/Map/MapShow/OnlineWorldJWVector.mapx");
//设置地图加载监听
mapView.setMapLoadListener(new MapViewMapLoadListener() {
    @Override
    public void mapViewWillStartLoadingMap(MapView arg0, String arg1) {
        //开始加载地图
    }

    @Override
    public void mapViewDidFinishLoadingMap(MapView arg0, String arg1) {
        //地图加载完成
    }

    @Override
    public void mapViewDidFailLoadingMap(MapView arg0, String arg1) {
        //地图加载失败
    }
});

代码说明:loadFromFileAsync接口中传入的是在线地图文档mapx格式文件的完整路径,mapx地图文档需要用户自己在MapGIS桌面平台软件中进行组织配置。

2、loadFromDocumentAsync方法

//以loadfromdocumentaync方式加载在线矢量地图文档,需要在子线程中执行document.open方法,请求在线数据
Runnable run = new Runnable() {
    @Override
    public void run() {
        //使用此种方法,document对象必须设置为成员变量,否则的话会因为java内存回收机制容易导致程序崩溃
        if (doc == null) {
            doc = new Document();
        }

        //打开地图文档
        doc.open(MainActivity.rootPath+"/MapGIS Mobile 2D Sample/Map/MapShow/OnlineWorldJWVector.mapx");

        //发送消息
        Message msg = new Message();
        msg.what = 1;
        mHandler.sendMessage(msg);
    }
};
//开启子线程
new Thread(run).start();

//handler处理消息
mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        //加载地图,loadfromdocumentasync,加载地图文档对应索引的地图
        mapView.loadFromDocumentAsync(doc, 0, new MapViewFinishCallback() {
            @Override
            public void onDidFinish(boolean arg0) {
                if (arg0) {
                    //地图加载完成
                } else {
                    //地图加载失败
                }
            }
        });
    }
};

显示效果如下所示:

在线矢量地图显示效果.jpg 0302在线瓦片地图显示效果.jpg 0303在线WMS地图显示效果.jpg